package com.cskaoyan.javase.oop3._1interface._4example.operation.impl;

import com.cskaoyan.javase.oop3._1interface._4example.model.Goods;
import com.cskaoyan.javase.oop3._1interface._4example.model.GoodsData;
import com.cskaoyan.javase.oop3._1interface._4example.operation.GoodsOperation;

/**
 * 对商品的数组做操作
 * 完成商品数组的增删改查
 *
 * @since 16:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class GoodsOperationImpl implements GoodsOperation {

    // 直接获取数据源,然后使用
    private Goods[] goods = GoodsData.GOODS;

    @Override
    public Goods[] getAllGoods() {
        // 这里还是去掉数组中的null元素
        int count = 0;
        for (Goods good : goods) {
            if (good != null) {
                count++;
            }
        }
        // 创建新数组
        Goods[] result = new Goods[count];
        // 遍历赋值
        int newIndex = 0;
        for (int i = 0; i < goods.length; i++) {
            if (goods[i] != null) {
                result[newIndex] = goods[i];
                newIndex++;
            }
        }
        return result;
    }

    /**
     * 根据前端传入的商品信息,创建商品对象,然后插入数组
     * 插入的情况有三种,对应三个返回值:
     *      1: 表示插入成功
     *      2: 表示ID重复,插入失败
     *      3: 表示数组满了,插入失败
     *
     * @since 16:37
     * @param id 前端传入的商品id
     * @param name 前端传入的商品名字
     * @param price 前端传入的商品价格
     * @return int
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    @Override
    public int createGoods(int id, String name, double price) {
        // 0.在整体插入之前,先判断一下ID是否重复,重复禁止插入
        // 遍历数组,为了避免空指针异常,遍历没有null元素的数组
        for (Goods good : getAllGoods()) {
            int idExist = good.getId();
            if (idExist == id) {
                // id重复
                return 2;
            }
        }
        // 代码执行到这里,id一定是不重复的
        // 1.创建商品对象
        Goods g = new Goods(id, name, price);
        // 2.插入数据源数组中
        // 找到第一个为null的位置,然后插入进去
        for (int i = 0; i < goods.length; i++) {
            if (goods[i] == null) {
                goods[i] = g;
                // 插入成功
                return 1;
            }
        }
        // 代码运行到这里,说明没有等于null元素的位置了,说明数组满了,插入失败
        return 3;
    }

    /**
     * 根据前端给出的商品id,进行删除,删除成功返回true
     * 否者返回false
     * @since 16:40
     * @param id 前端传入的商品id
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    @Override
    public boolean deleteGoods(int id) {
        // 这里的删除不是真正意义上的删除,而是赋值为null
        for (int i = 0; i < goods.length; i++) {
            // 处理避免空指针异常
            if (goods[i] == null){
                continue;
            }
            if (goods[i].getId() == id) {
                // 找到该元素,值替换成null
                goods[i] = null;
                // 删除成功
                return true;
            }
        }
        // 删除失败
        return false;
    }
}
